package api

import (
	"config-client-v1/model"
	"config-client-v1/utils/tools"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
)

type AlertController struct {
}

func (con AlertController) AlertList(ctx *gin.Context) {
	userToken := GetUserToken(ctx)
	param := struct {
		BaseAddr       string `json:"base_addr" binding:"max=20"`
		RecoveryStatus string `json:"recovery_status"`
		ReadStatus     string `json:"read_status"`
		model.QueryData
	}{}
	err := ctx.ShouldBindBodyWith(&param, binding.JSON)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    2,
			"message": "无效的参数",
			"data":    err.Error(),
		})
		return
	}
	param.TimeHandle(0)

	tx := model.DB.Model(&model.VarAlert{}).Where("project_id = ?", userToken.ProjectID)
	if param.StartTime != "" {
		tx.Where("create_time >= ?", param.StartTime)
	}
	if param.EndTime != "" {
		tx.Where("create_time <= ?", param.EndTime)
	}
	if param.BaseAddr != "" {
		tx.Where("base_addr = ?", param.BaseAddr)
	}

	if param.RecoveryStatus == "" {
		param.RecoveryStatus = "all"
	}

	switch param.RecoveryStatus {
	case "alarm":
		tx.Where("is_recovery = 0") // 查询正在告警的
	case "recovery":
		tx.Where("is_recovery = 1") // 查询已恢复的
	case "all":
	default:
		ctx.JSON(200, gin.H{
			"code":    2,
			"message": "无效的参数 status",
		})
		return
	}

	if param.ReadStatus == "" {
		param.ReadStatus = "all"
	}
	switch param.ReadStatus {
	case "read":
		tx.Where("is_read = 1") // 查询已读的
	case "unread":
		tx.Where("is_read = 0") // 查询未读的
	case "all":
	default:
		ctx.JSON(200, gin.H{
			"code":    2,
			"message": "无效的参数 status",
		})
		return
	}

	var count int64
	list := make([]*model.VarAlert, 0)
	err = tx.Count(&count).Error
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    6,
			"message": err.Error(),
		})
		return
	}
	err = tx.Order("create_time DESC").Offset(param.StartPage()).Limit(param.PageSize).Find(&list).Error
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    6,
			"message": err.Error(),
		})
		return
	}

	for _, row := range list {
		at, _ := model.AlertTypeMap.Get(row.Const)
		row.Audio = at.Audio
	}

	//tools.SliceReverse(&list)
	ctx.JSON(200, gin.H{
		"code":    0,
		"message": "success",
		"data": map[string]interface{}{
			"list":  list,
			"count": count,
		},
	})
}

func (con AlertController) AlertConfirm(ctx *gin.Context) {
	param := struct {
		Type string `json:"type" binding:"required"` // single, multi, all
		ID   int    `json:"id"`
		IDS  string `json:"ids"`
	}{}
	err := ctx.ShouldBindBodyWith(&param, binding.JSON)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    2,
			"message": "无效的参数",
			"data":    err.Error(),
		})
		return
	}

	tx := model.DB.Model(&model.VarAlert{})
	switch param.Type {
	case "single":
		if param.ID == 0 {
			ctx.JSON(200, gin.H{
				"code":    2,
				"message": "id不能为空",
				"data":    "",
			})
			return
		}
		tx.Where("id = ?", param.ID)
	case "multi":
		if param.IDS == "" {
			ctx.JSON(200, gin.H{
				"code":    2,
				"message": "ids不能为空",
				"data":    "",
			})
			return
		}
		idArr := tools.StrToIntSlice(param.IDS)
		tx.Where("id in ?", idArr)
	case "all":
		tx.Where("1=1")
	}

	err = tx.Update("is_read", 1).Error
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    6,
			"message": err.Error(),
		})
		return
	}

	ctx.JSON(200, gin.H{
		"code":    0,
		"message": "success",
		"data":    map[string]interface{}{},
	})
}

func (con AlertController) AudioShield(ctx *gin.Context) {
	param := struct {
		ID int `json:"id" binding:"required"`
		//AudioShield uint8 `json:"audio_shield"`
	}{}
	err := ctx.ShouldBindBodyWith(&param, binding.JSON)

	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    2,
			"message": "无效的参数",
			"data":    err.Error(),
		})
		return
	}
	//if param.AudioShield != 0 && param.AudioShield != 1 {
	//	ctx.JSON(200, gin.H{
	//		"code":    2,
	//		"message": "无效的参数 audio_shield",
	//		"data":    "",
	//	})
	//	return
	//}

	info := &model.VarAlert{}
	err = model.DB.Model(&model.VarAlert{}).Where("id = ?", param.ID).Limit(1).Find(info).Error
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    6,
			"message": err.Error(),
		})
		return
	}
	if info.ID == 0 {
		ctx.JSON(200, gin.H{
			"code":    2,
			"message": "无效的参数 id",
			"data":    "",
		})
		return
	}

	err = model.DB.Model(&model.VarAlert{}).Where("id = ?", param.ID).Update("audio_shield", 1).Error
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    6,
			"message": err.Error(),
		})
		return
	}
	//key := fmt.Sprintf("%s", info.BaseAddr)
	//v, ok := model.AlertDataMap.Get(key)
	//if ok {
	//	v.AudioShield = param.AudioShield
	//}
	ctx.JSON(200, gin.H{
		"code":    0,
		"message": "success",
		"data":    map[string]interface{}{},
	})
}

func (con AlertController) SysAlertList(ctx *gin.Context) {
	userToken := GetUserToken(ctx)
	param := struct {
		Alert      string `json:"alert" binding:"max=100"`
		ReadStatus string `json:"read_status" binding:"max=20"`
		model.QueryData
	}{}
	err := ctx.ShouldBindBodyWith(&param, binding.JSON)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    2,
			"message": "无效的参数",
			"data":    err.Error(),
		})
		return
	}
	param.TimeHandle(0)

	tx := model.DB.Model(&model.SysAlert{}).Where("project_id = ?", userToken.ProjectID)
	if param.StartTime != "" {
		tx.Where("create_time >= ?", param.StartTime)
	}
	if param.EndTime != "" {
		tx.Where("create_time <= ?", param.EndTime)
	}
	if param.Alert != "" {
		tx.Where("alert like ?", "%"+param.Alert+"%")
	}

	if param.ReadStatus == "" {
		param.ReadStatus = "all"
	}
	switch param.ReadStatus {
	case "read":
		tx.Where("is_read = 1") // 查询已读的
	case "unread":
		tx.Where("is_read = 0") // 查询未读的
	case "all":
	default:
		ctx.JSON(200, gin.H{
			"code":    2,
			"message": "无效的参数 status",
		})
		return
	}

	var count int64
	list := make([]*model.SysAlert, 0)
	err = tx.Count(&count).Error
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    6,
			"message": err.Error(),
		})
		return
	}
	err = tx.Order("create_time DESC").Offset(param.StartPage()).Limit(param.PageSize).Find(&list).Error
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    6,
			"message": err.Error(),
		})
		return
	}

	//tools.SliceReverse(&list)
	ctx.JSON(200, gin.H{
		"code":    0,
		"message": "success",
		"data": map[string]interface{}{
			"list":  list,
			"count": count,
		},
	})
}

func (con AlertController) SysAlertConfirm(ctx *gin.Context) {
	param := struct {
		Type string `json:"type" binding:"required"` // single, multi, all
		ID   int    `json:"id"`
		IDS  string `json:"ids"`
	}{}
	err := ctx.ShouldBindBodyWith(&param, binding.JSON)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    2,
			"message": "无效的参数",
			"data":    err.Error(),
		})
		return
	}

	tx := model.DB.Model(&model.SysAlert{})
	switch param.Type {
	case "single":
		if param.ID == 0 {
			ctx.JSON(200, gin.H{
				"code":    2,
				"message": "id不能为空",
				"data":    "",
			})
			return
		}
		tx.Where("id = ?", param.ID)
	case "multi":
		if param.IDS == "" {
			ctx.JSON(200, gin.H{
				"code":    2,
				"message": "ids不能为空",
				"data":    "",
			})
			return
		}
		idArr := tools.StrToIntSlice(param.IDS)
		tx.Where("id in ?", idArr)
	case "all":
		tx.Where("1=1")
	}

	err = tx.Update("is_read", 1).Error
	if err != nil {
		ctx.JSON(200, gin.H{
			"code":    6,
			"message": err.Error(),
		})
		return
	}

	ctx.JSON(200, gin.H{
		"code":    0,
		"message": "success",
		"data":    map[string]interface{}{},
	})
}
